#pragma once
#include "common.h"
/*
    SBI 函数必须在 `a0` 和 `a1` 中返回一对值，其中 `a0` 返回错误代码。这类似于返回 C 结构体
*/
struct  sbiret
{
    long error;
    long value;
};

#define PROCESS_MAX_NUM 8
typedef enum {
    PROC_UNUSED,
    PROC_RUNNABLE,
} PROC_STATE;

#define PROCESS_STACK_SIZE 8192

typedef struct {
    uint32_t pid;
    PROC_STATE state;
    vaddr_t sp; // stack pointer
    uint32_t* page_table;
    uint8_t stack[PROCESS_STACK_SIZE];  // 内核栈，保存CPU寄存器、返回地址和局部变量
} process;

#define SATP_SV32 (1U << 31)
#define PAGE_V (1U << 0) // valid (表项已启用) 
#define PAGE_R (1U << 1) // read (读权限)
#define PAGE_W (1U << 2) // write (写权限)
#define PAGE_X (1U << 3) // execute (执行权限)
#define PAGE_U (1U << 4) // user (用户模式可访问)

paddr_t alloc_pages(uint32_t n);
